﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Windows.Forms;
using System.Drawing.Drawing2D;

namespace Edigio
{
	public class Tab_control_con_cierre : System.Windows.Forms.TabControl
	{
		// Delegado para indicar cual es la pagina que se cerró
		public delegate bool indicador_de_pestania_de_cerrada(int indx);

		// Color Inicial del gradiente
		private Color color_inicial_del_gradiente;

		// Color Final del gradiente
		private Color color_final_del_gradiente;

		// Propiedad del color inicial del gradiente
		public Color color_inicial_de_la_pestania
		{
			get { return color_inicial_del_gradiente; }
			set { color_inicial_del_gradiente = value; repintar_pestanias(); }
		}

		// Propiedad del color final del gradiente
		public Color color_final_de_la_pestania
		{
			get { return color_final_del_gradiente; }
			set { color_final_del_gradiente = value; repintar_pestanias(); }
		}

		public indicador_de_pestania_de_cerrada indicador_de_pestania_de_cerrada1;

		public Tab_control_con_cierre()
		{
			indicador_de_pestania_de_cerrada1 = null;
			Font = Font;

			// Le indicamos que vamos a dibajar de forma manual
			this.DrawMode = TabDrawMode.OwnerDrawFixed;
			repintar_pestanias();
		}

		protected override void OnDrawItem(DrawItemEventArgs e)
		{
			Rectangle r = e.Bounds;
			// Cojemos el rectangulo cabezera de la ficha y creamos nuestro
			// rectangulo donde pintaremos el boton X y el texto
			r = GetTabRect(e.Index);
			r.Offset(2, 2);
			r.Width = 5;
			r.Height = 5;


			// Creamos un pincel para dibujar la x que aparecera en la cabezera de la ficha
			Brush b = new SolidBrush(Color.Black);
			Pen p = new Pen(b);
			p.Color = Color.Red;

			// Dibujamos la x que simulara el boton de cerrar ficha
			e.Graphics.DrawLine(p, r.X, r.Y, r.X + r.Width, r.Y + r.Height);
			e.Graphics.DrawLine(p, r.X + r.Width, r.Y, r.X, r.Y + r.Height);

			// Pintamos tambien el texto de la ficha
			string titel = this.TabPages[e.Index].Text;
			Font f = this.Font;
			e.Graphics.DrawString(titel, f, b, new PointF(r.X + 6, r.Y));
		}

		private void repintar_pestanias()
		{
			foreach (TabPage ctl in this.TabPages)
			{

				LinearGradientBrush gradPincel;
				// Creamos un pincel con las caracteristicas de tamaño de la ficha y con los colores especificados
				gradPincel = new LinearGradientBrush(new Point(0, 0), new Point(ctl.Width, ctl.Height), color_inicial_de_la_pestania, color_final_de_la_pestania);
				// Creamos una imagen que es la que vamos a "pegar" encima de la ficha
				Bitmap bmp = new Bitmap(ctl.Width, ctl.Height);

				Graphics g = Graphics.FromImage(bmp);
				g.FillRectangle(gradPincel, new Rectangle(0, 0, ctl.Width, ctl.Height));
				ctl.BackgroundImage = bmp;
				// Expandimos la imagen para que ocupe toda la ficha siempre
				ctl.BackgroundImageLayout = ImageLayout.Stretch;
			}
		}

		protected override void OnMouseClick(MouseEventArgs e)
		{
			// Obtenemos la posicion donde se ha pulsado el boton
			// del raton
			Point punto = e.Location;
			for (int i = 0; i < TabCount; i++)
			{
				// Comprobamos para cada Tab si las coordenadas obtenidas
				// en la pulsacion del raton estan contenidas dentro del
				// "cuadrado" correspondiente a la x de la cabezera de la
				// pestaña
				Rectangle r = GetTabRect(i);
				r.Offset(2, 2);
				r.Width = 5;
				r.Height = 5;
				if (r.Contains(punto))
				{
					cerrar_pestania(i);
				}
			}
		}

		// Cerramos la ficha que se haya pulsado
		public void cerrar_pestania(int i)
		{

			Scintilla_para_edigio editor_a_cerrar;
			bool pestania_cerrada;
			

			// Si no hay ninguna pagina eliminada
			if (indicador_de_pestania_de_cerrada1 != null)
			{
				// Obtenemos si la pagina ha sido eliminada
				pestania_cerrada = indicador_de_pestania_de_cerrada1(i);
				if (!pestania_cerrada)
				{
					return;
				}
			}

			editor_a_cerrar = (Scintilla_para_edigio)TabPages[i].Controls["editor"];

			// si el editor está modificado...
			if (editor_a_cerrar.Modified)
			{
				// preguntar si quiere guardar...
				DialogResult resultado = MessageBox.Show("El código se ha modificado, ¿desea guardar?", "¡Código modificado!", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning);

				// si quiere...
				if (resultado == DialogResult.Yes)
				{
					//dar el foco y llamar al método "actualizar archivo" para luego cerrarlo.

					editor_a_cerrar.Show();
					formulario_principal formulario_principal_temporal = (formulario_principal)formulario_principal.ActiveForm;
					formulario_principal_temporal.actualizar_archivo();

					TabPages.Remove(TabPages[i]);
				}
				else if (resultado == DialogResult.Cancel)
				{
					return;
				}
				else
				{
					// Se elimina la pestaña.
					TabPages.Remove(TabPages[i]);
				}
			}
			else // si no está modificado...
			{
				// Idem.
				TabPages.Remove(TabPages[i]);
			}
		}
	}
}
